<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>关闭服务器</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="kernel-resources.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="runtime.html">快退</a></td><td width="60%" align="center" valign="bottom">章16. 操作系统环境</td><td width="10%" align="right" valign="top"><a href="runtime.html">快进</a></td><td width="10%" align="right" valign="top"><a href="encryption-options.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="SERVER-SHUTDOWN">16.5. 关闭服务器</a></h1><a name="AEN19389"></a>
<p>有好几种关闭数据库服务器的方法。通过给 <tt class="COMMAND">postgres</tt> 进程发送不同的信号，你就可以控制关闭服务器的不同方法。</p>
<div class="VARIABLELIST">
<dl>
<dt><span class="SYSTEMITEM">SIGTERM</span><a name="AEN19397"></a></dt>
<dd><p>不再允许新的连接，但是允许所有活跃的会话正常完成他们的工作，只有在所有会话都结束任务后才关闭。这是<i class="FIRSTTERM">智能关闭</i>。</p></dd>
<dt><span class="SYSTEMITEM">SIGINT</span><a name="AEN19406"></a></dt>
<dd><p>不再允许新的连接，向所有活跃服务器发送 <span class="SYSTEMITEM">SIGTERM</span>(让它们立刻退出)，然后等待所有子进程退出并关闭数据库。这是<i class="FIRSTTERM">快速关闭</i>。</p></dd>
<dt><span class="SYSTEMITEM">SIGQUIT</span><a name="AEN19415"></a></dt>
<dd><p>令 <tt class="COMMAND">postgres</tt> 向所有子进程发送 <span class="SYSTEMITEM">SIGQUIT</span> 并且立即退出(所有子进程也会立即退出)，而不会妥善地关闭数据库系统。这是<i class="FIRSTTERM">立即关闭</i>。这样做会导致下次启动时的恢复(通过重放 WAL 日志)。我们推荐只在紧急的时候使用这个方法。</p></dd>
</dl>
</div>
<p><a href="app-pg-ctl.html"><span class="APPLICATION">pg_ctl</span></a> 程序提供了一个发送这些信号关闭服务器的便利接口。</p>
<p>另外，你可以用 <tt class="COMMAND">kill</tt> 直接发送这些信号。可以用 <tt class="COMMAND">ps</tt> 命令或者从数据目录里的 <tt class="FILENAME">postmaster.pid</tt> 文件中找出 <tt class="COMMAND">postgres</tt> 的 PID 。所以，举例来说，要做一次快速关闭：</p>
<pre class="SCREEN">$ <kbd class="USERINPUT">kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`</kbd></pre>
<div class="IMPORTANT">
<blockquote class="IMPORTANT">
<p><b>【重要】</b>尽可能不要用 <span class="SYSTEMITEM">SIGKILL</span> 关闭服务器。这样会阻止服务器清理共享内存和信号灯资源，那样的话你只能在启动服务器之前自己手工做这件事。另外，<span class="SYSTEMITEM">SIGKILL</span> 直接把 <tt class="COMMAND">postgres</tt> 杀掉，而不会等它把信号中继给它的子进程，因此我们还需要手工杀掉每个独立子进程。</p>
</blockquote>
</div>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="kernel-resources.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="encryption-options.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">管理内核资源</td><td width="34%" align="center" valign="top"><a href="runtime.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">加密选项</td></tr>
</table>
</div>
</body></html>